En este trabajo se abordará el problema de agrupar los barrios de Medellín de acuerdo a distintas dimensiones y analizar espacialmente las agrupaciones.
#Dimensión Salud
La dimensión de salud mide que tan informados se encuentran las Medellinenses sobre los métodos de planificación familiar y que tanto hacen uso del sistema de salud de la ciudad.
Para la el análisis de la dimensión de SALUD en los barrios de Medellín se toman las siguientes preguntas con sus respectivos indicadores:
P_308 - ¿Usted planifica? Posibles respuestas: * 99 No responde * 88 No aplica * 1 Si * 2 No
P_324 - ¿En los últimos 30 días, tuvo alguna enfermedad, accidente, problema odontológico, o algún otro problema de salud que no haya implicado hospitalización? Posibles respuestas: * 99 No responde * 88 No aplica * 1 Si * 2 No
P_325 - ¿Para tratar ese problema de salud, que hizo principalmente? Posibles respuestas * -99 No responde * -98 No sabe. * -88 No aplica * -77 Otro * 1 Consultó la Red de servicios de salud. * 2 Acudió a una terapia alternativa. * 3 Acudió a un boticario o farmaceuta * 4 Consultó a un tegua, empírico, curandero, yerbatero, comadrona, etc. * 5 Usó remedios caseros * 6 Se automedicó * 7 Nada
P_326 - ¿Cuál fue la principal razón por la que no solicitó o no recibió atención por el problema de salud? Posibles respuestas * -99 No responde * -98 No sabe * -88 No aplica * -77 Otro * 1 El caso era leve * 2 No tuvo tiempo * 3 El centro de Atención en salud queda lejos * 4 Falta dinero * 5 Mal servicio o citas distanciadas en el tiempo * 6 No lo atendieron * 7 No confía en los médicos o personal de salud * 8 Consultó antes y no le resolvieron el problema * 9 Muchos trámites para la cita
P_327 - En los últimos 12 meses (en caso de no haberlos utilizado ponga (0) Utilizó los servicios de promoción y prevención Posibles respuestas * 1 - Si * 2 - No
library(devtools)
## Loading required package: usethis
load_all("./Package/utiltae")
## Loading Utiltae
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## -------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## -------------------------------------------------------------------------
##
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
library(Utiltae)
library(dplyr)
library(lazyeval)
library(ggplot2)
library(gtable)
library(utils)
library(knitr)
library(kableExtra)
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
library("factoextra")
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(cluster)
library(plyr)
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
##
## Attaching package: 'GGally'
## The following object is masked from 'package:dplyr':
##
## nasa
library(magrittr)
library('sqldf')
## Loading required package: gsubfn
## Loading required package: proto
## Loading required package: RSQLite
library(rgdal)
## Loading required package: sp
## rgdal: version: 1.4-8, (SVN revision 845)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 2.4.2, released 2019/06/28
## Path to GDAL shared files: /Library/Frameworks/R.framework/Versions/3.6/Resources/library/rgdal/gdal
## GDAL binary built with GEOS: FALSE
## Loaded PROJ.4 runtime: Rel. 5.2.0, September 15th, 2018, [PJ_VERSION: 520]
## Path to PROJ.4 shared files: /Library/Frameworks/R.framework/Versions/3.6/Resources/library/rgdal/proj
## Linking to sp version: 1.3-2
library(leaflet)
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following objects are masked from 'package:plyr':
##
## arrange, mutate, rename, summarise
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
El insumo principal de este trabajo son los datos abiertos del portal Medata[1] y en particular la Encuesta de Calidad de Vida Medellín Cómo vamos.
ECV <- read.csv("./dataSet/encuesta_calidad_vida.csv", header = TRUE, sep=";")
# Cambio de la cabecera de dataFrame por nombras más legibles.
ECV <- setNames(ECV, set_dataSet_names(names(ECV)))
#Seleción de las caracteristicas y preguntas a analizar en el ejercicio.
ECV_SALUD <- ECV[,c("encuesta","persona","comuna","barrio","estrato","p_15","p_307","p_308","p_324","p_325","p_326","p_327")]
ECV_SALUD_BARRIO <- ECV_SALUD %>% select(encuesta,comuna, barrio,persona) %>%
group_by(encuesta, comuna, barrio) %>%
summarise(total = max(persona)) %>% ungroup() %>%
group_by(comuna, barrio) %>% summarise(total = sum(total)) %>% ungroup()
tmp <- ECV_SALUD[ECV_SALUD$p_307 == 1,] %>%
group_by(encuesta, comuna, barrio) %>% summarise(p_307 = sum(p_307)) %>% ungroup() %>%
group_by(comuna,barrio) %>% summarise(p_307 = sum(p_307)) %>% ungroup()
ECV_SALUD_BARRIO <- merge(x=ECV_SALUD_BARRIO,y=tmp,by.x=(c("comuna", "barrio")),all.x=TRUE)
if(exists('tmp')) rm(tmp)
ECV_SALUD_BARRIO$p_307 <- ECV_SALUD_BARRIO$p_307 / ECV_SALUD_BARRIO$total
tmp <- ECV_SALUD[ECV_SALUD$p_15 == 2,] %>% select(encuesta, comuna, barrio,persona) %>%
group_by(encuesta,comuna, barrio) %>% summarise(total_mujer = n_distinct(persona)) %>% ungroup() %>%
group_by(comuna,barrio) %>% summarise(total_mujer = sum(total_mujer)) %>% ungroup()
ECV_SALUD_BARRIO <- merge(x=ECV_SALUD_BARRIO,y=tmp,by.x=(c("comuna", "barrio")),all.x=TRUE)
if(exists('tmp')) rm(tmp)
tmp <- subset(ECV_SALUD, p_308 == 1) %>% select(encuesta,comuna,barrio,persona) %>%
group_by(encuesta, comuna,barrio) %>% summarise(p_308 = n_distinct(persona)) %>% ungroup() %>%
group_by(comuna,barrio) %>% summarise(p_308 = sum(p_308)) %>% ungroup()
ECV_SALUD_BARRIO <- merge(x=ECV_SALUD_BARRIO,y=tmp, by.x=(c("comuna", "barrio")),all.x=TRUE)
if(exists('tmp')) rm(tmp)
ECV_SALUD_BARRIO$p_308 <- ECV_SALUD_BARRIO$p_308 / ECV_SALUD_BARRIO$total
tmp <- ECV_SALUD[ECV_SALUD$p_324 == 1,] %>%
group_by(encuesta, comuna,barrio) %>% summarise(p_324 = n_distinct(persona)) %>% ungroup() %>%
group_by(comuna,barrio) %>% summarise(p_324 = sum(p_324)) %>% ungroup()
ECV_SALUD_BARRIO <- merge(x=ECV_SALUD_BARRIO,y=tmp, by.x=(c("comuna", "barrio")),all.x=TRUE)
if(exists('tmp')) rm(tmp)
ECV_SALUD_BARRIO$p_324 <- ECV_SALUD_BARRIO$p_324 / ECV_SALUD_BARRIO$total
tmp <- ECV_SALUD[ECV_SALUD$p_325 == 1,] %>%
group_by(encuesta, comuna,barrio) %>% summarise(p_325 = n_distinct(persona)) %>% ungroup() %>%
group_by(comuna,barrio) %>% summarise(p_325 = sum(p_325)) %>% ungroup()
ECV_SALUD_BARRIO <- merge(x=ECV_SALUD_BARRIO,y=tmp, by.x=(c("comuna", "barrio")),all.x=TRUE)
if(exists('tmp')) rm(tmp)
ECV_SALUD_BARRIO$p_325 <- ECV_SALUD_BARRIO$p_325 / ECV_SALUD_BARRIO$total
Cálculo p_326. Porcentaje de personas que no solicitaron o no recibieron atención médica por mal servicio, definiendo mal servicio como el conjunto de respuestas:
tmp <- subset(ECV_SALUD, p_326 == 5 | p_326 == 6 | p_326 == 7 | p_326 == 8) %>%
group_by(encuesta, comuna,barrio) %>% summarise(p_326 = n_distinct(persona)) %>% ungroup() %>%
group_by(comuna,barrio) %>% summarise(p_326 = sum(p_326)) %>% ungroup()
ECV_SALUD_BARRIO <- merge(x=ECV_SALUD_BARRIO,y=tmp, by.x=(c("comuna", "barrio")),all.x=TRUE)
if(exists('tmp')) rm(tmp)
ECV_SALUD_BARRIO$p_326 <- ECV_SALUD_BARRIO$p_326 / ECV_SALUD_BARRIO$total
tmp <- ECV_SALUD[ECV_SALUD$p_327 == 1,] %>%
group_by(encuesta, comuna,barrio) %>% summarise(p_327 = n_distinct(persona)) %>% ungroup() %>%
group_by(comuna,barrio) %>% summarise(p_327 = sum(p_327)) %>% ungroup()
ECV_SALUD_BARRIO <- merge(x=ECV_SALUD_BARRIO,y=tmp, by.x=(c("comuna", "barrio")),all.x=TRUE)
if(exists('tmp')) rm(tmp)
ECV_SALUD_BARRIO$p_327 <- ECV_SALUD_BARRIO$p_327 / ECV_SALUD_BARRIO$total
Depuración de columnas
ECV_SALUD_BARRIO$total <- NULL
ECV_SALUD_BARRIO$total_mujer <- NULL
Estadisticas básicas SALUD
summary(ECV_SALUD_BARRIO)
## comuna barrio p_307 p_308
## EL POBLADO : 22 SAN PABLO : 3 Min. :0.2500 Min. :0.1374
## ROBLEDO : 22 EL LLANO : 2 1st Qu.:0.7595 1st Qu.:0.2992
## BELEN : 21 EL SALADO : 2 Median :0.7903 Median :0.3528
## SAN CRISTOBAL: 21 LA ESPERANZA: 2 Mean :0.7860 Mean :0.3562
## SAN JAVIER : 19 LA FLORIDA : 2 3rd Qu.:0.8207 3rd Qu.:0.3985
## VILLA HERMOSA: 18 LA PALMA : 2 Max. :1.0000 Max. :1.0000
## (Other) :187 (Other) :297 NA's :1 NA's :3
## p_324 p_325 p_326 p_327
## Min. :0.01105 Min. :0.01105 Min. :0.00070 Min. :0.004073
## 1st Qu.:0.06574 1st Qu.:0.04742 1st Qu.:0.00366 1st Qu.:0.054422
## Median :0.08421 Median :0.06178 Median :0.00579 Median :0.077491
## Mean :0.08903 Mean :0.06718 Mean :0.00843 Mean :0.084350
## 3rd Qu.:0.10614 3rd Qu.:0.07926 3rd Qu.:0.00922 3rd Qu.:0.095364
## Max. :0.28571 Max. :0.28571 Max. :0.12500 Max. :0.500000
## NA's :16 NA's :19 NA's :132 NA's :17
Existen valores nulos dentro del dataframe, analizando cuales de ellos son debido a que no respondieron ninguna de las preguntas de la encuesta relacionadas a Salud, se encuentra que los nulos no son debido a que no quisieron responder la encuesta completa en temas de salud, sino que personas que no quisieron contestar alguna pregunta particular.
row.has.na <- apply(ECV_SALUD, 1, function(x){any(is.na(x))})
ECV_SALUD[row.has.na,]
## [1] encuesta persona comuna barrio estrato p_15 p_307
## [8] p_308 p_324 p_325 p_326 p_327
## <0 rows> (or 0-length row.names)
##2. Agrupamientos
Para efectos de la ejecución de los modelos, los valores del data frame ECV_SALUD_BARRIO que sean nulos se llenan con 0 dado que cuando se presenta un valor NAN significa que el indicador no aplica para el barrio y el cero lo representa
ECV_SALUD_BARRIO[is.na(ECV_SALUD_BARRIO)] <- 0
Si bien, la mayoria de los indicadores del dataframe ECV_SALUD_BARRIO se encuentran en función de personas para evitar cualquier dato erroneo por efectos de cambios en escala, se normalizan los datos
ECV_SALUD_BARRIO_CP <- ECV_SALUD_BARRIO
#Concatenación de comuna y barrio ya que existen nombres iguales de barrio en diferentes comunas
ECV_SALUD_BARRIO_CP$barrio <- paste(ECV_SALUD_BARRIO_CP$comuna,ECV_SALUD_BARRIO_CP$barrio,sep = "-")
ECV_SALUD_BARRIO_CP$comuna <- NULL
ECV_SALUD_BARRIO_SCALE <- tibble::column_to_rownames(ECV_SALUD_BARRIO_CP, var = "barrio")
Se utilizan diferentes métodos para determinar el k óptimo a utilizar en el algoritmo de clusterización - Kmeans
fviz_nbclust(ECV_SALUD_BARRIO_SCALE, kmeans, method = "wss") + labs(title= "Número óptimo de Clusters") + xlab("Número de Cluster (K)")
SS <- fviz_nbclust(ECV_SALUD_BARRIO_SCALE, kmeans, method = "wss")
plot(2:10,diff(SS$data$y), type = "h", main="Diferencia en errores", xlab="k", ylab="diff")
fviz_nbclust(ECV_SALUD_BARRIO_SCALE, kmeans, method = "silhouette")
Dado que para los diferentes métodos de determinación del k óptimo, hay dos posibles opciones, k =2 y k = 4, se ejecuta el algoritmo con estos posibles valores y se tomará aquel que tenga minimo error.
set.seed(1988)
kmeans_model_k2 <- kmeans(ECV_SALUD_BARRIO_SCALE, 2, nstart = 50)
kmeans_model_k4 <- kmeans(ECV_SALUD_BARRIO_SCALE, 4, nstart = 50)
print("Total SS k=2: ")
## [1] "Total SS k=2: "
kmeans_model_k2$totss
## [1] 7.246404
print("Total SS k=4: ")
## [1] "Total SS k=4: "
kmeans_model_k4$totss
## [1] 7.246404
En k = 4 el ajuste del modelo mejora , por lo tanto se toma éste como el número de k para el modelo
fviz_cluster(kmeans_model_k4, data = ECV_SALUD_BARRIO_SCALE, geom = "point") + ggtitle("Distribución de los barrios en los clusters")
Se procede a agregar el cluster a la data original
df_member_salud <- cbind(ECV_SALUD_BARRIO, cluster = kmeans_model_k4$cluster)
head(df_member_salud)
## comuna
## ALTAVISTA-AGUAS FRÍAS ALTAVISTA
## ALTAVISTA-ALTAVISTA CENTRAL ALTAVISTA
## ALTAVISTA-ÁREA DE EXPANSIÓN ALTAVISTA ALTAVISTA
## ALTAVISTA-ÁREA DE EXPANSIÓN BELÉN RINCÓN ALTAVISTA
## ALTAVISTA-BUGA PATIO BONITO ALTAVISTA
## ALTAVISTA-CABECERA ALTAVISTA ALTAVISTA
## barrio
## ALTAVISTA-AGUAS FRÍAS AGUAS FRÍAS
## ALTAVISTA-ALTAVISTA CENTRAL ALTAVISTA CENTRAL
## ALTAVISTA-ÁREA DE EXPANSIÓN ALTAVISTA ÁREA DE EXPANSIÓN ALTAVISTA
## ALTAVISTA-ÁREA DE EXPANSIÓN BELÉN RINCÓN ÁREA DE EXPANSIÓN BELÉN RINCÓN
## ALTAVISTA-BUGA PATIO BONITO BUGA PATIO BONITO
## ALTAVISTA-CABECERA ALTAVISTA CABECERA ALTAVISTA
## p_307 p_308 p_324
## ALTAVISTA-AGUAS FRÍAS 0.6587302 0.4206349 0.11904762
## ALTAVISTA-ALTAVISTA CENTRAL 0.7731755 0.3096647 0.13214990
## ALTAVISTA-ÁREA DE EXPANSIÓN ALTAVISTA 0.6970954 0.2116183 0.07883817
## ALTAVISTA-ÁREA DE EXPANSIÓN BELÉN RINCÓN 0.7887931 0.1465517 0.23275862
## ALTAVISTA-BUGA PATIO BONITO 0.6666667 0.4375000 0.10119048
## ALTAVISTA-CABECERA ALTAVISTA 0.8253012 0.5060241 0.00000000
## p_325 p_326 p_327
## ALTAVISTA-AGUAS FRÍAS 0.11904762 0 0.07936508
## ALTAVISTA-ALTAVISTA CENTRAL 0.09664694 0 0.06311637
## ALTAVISTA-ÁREA DE EXPANSIÓN ALTAVISTA 0.07883817 0 0.06639004
## ALTAVISTA-ÁREA DE EXPANSIÓN BELÉN RINCÓN 0.19827586 0 0.13793103
## ALTAVISTA-BUGA PATIO BONITO 0.06845238 0 0.09226190
## ALTAVISTA-CABECERA ALTAVISTA 0.00000000 0 0.00000000
## cluster
## ALTAVISTA-AGUAS FRÍAS 4
## ALTAVISTA-ALTAVISTA CENTRAL 2
## ALTAVISTA-ÁREA DE EXPANSIÓN ALTAVISTA 2
## ALTAVISTA-ÁREA DE EXPANSIÓN BELÉN RINCÓN 2
## ALTAVISTA-BUGA PATIO BONITO 4
## ALTAVISTA-CABECERA ALTAVISTA 4
Análisis para cada uno de los grupos
Grupo 1
summary(df_member_salud[df_member_salud$cluster == 1,])
## comuna barrio p_307 p_308
## LA CANDELARIA:1 EL CARMELO :1 Min. :0.0000 Min. :0
## SAN CRISTOBAL:1 GUAYAQUIL :1 1st Qu.:0.0625 1st Qu.:0
## ALTAVISTA :0 AGUAS FRÍAS :0 Median :0.1250 Median :0
## ARANJUEZ :0 ALDEA PABLO VI :0 Mean :0.1250 Mean :0
## BELEN :0 ALEJANDRÍA :0 3rd Qu.:0.1875 3rd Qu.:0
## BUENOS AIRES :0 ALEJANDRO ECHAVARRÍA:0 Max. :0.2500 Max. :0
## (Other) :0 (Other) :0
## p_324 p_325 p_326 p_327 cluster
## Min. :0 Min. :0 Min. :0 Min. :0.000 Min. :1
## 1st Qu.:0 1st Qu.:0 1st Qu.:0 1st Qu.:0.125 1st Qu.:1
## Median :0 Median :0 Median :0 Median :0.250 Median :1
## Mean :0 Mean :0 Mean :0 Mean :0.250 Mean :1
## 3rd Qu.:0 3rd Qu.:0 3rd Qu.:0 3rd Qu.:0.375 3rd Qu.:1
## Max. :0 Max. :0 Max. :0 Max. :0.500 Max. :1
##
Las preguntas que tienen mayor peso sobre este cluster son p_307- Porcentaje de personas que consideran que tienen suficiente información sobre los métodos de planificación familiar en donde el 12% de los encuestados dicen tener información y p_327 Porcentaje de personas que utilizan servicios de promocion y prevención, en donde el 25% de los encuestados los utilizan, para las demás respuestas, los encuestados no tienen ninguna opinión. La población de este cluster son solo dos barrios
Grupo 2
summary(df_member_salud[df_member_salud$cluster == 2,])
## comuna barrio
## BELEN :18 LA PALMA : 2
## LAURELES-ESTADIO:15 ALEJANDRÍA : 1
## LA AMERICA :12 ALFONSO LÓPEZ : 1
## EL POBLADO :11 ALTAVISTA CENTRAL : 1
## ROBLEDO :10 ÁREA DE EXPANSIÓN ALTAVISTA : 1
## BUENOS AIRES : 9 ÁREA DE EXPANSIÓN BELÉN RINCÓN: 1
## (Other) :62 (Other) :130
## p_307 p_308 p_324 p_325
## Min. :0.5526 Min. :0.0000 Min. :0.00000 Min. :0.00000
## 1st Qu.:0.7335 1st Qu.:0.2616 1st Qu.:0.05786 1st Qu.:0.04427
## Median :0.7711 Median :0.2941 Median :0.07955 Median :0.05875
## Mean :0.7625 Mean :0.2846 Mean :0.08490 Mean :0.06303
## 3rd Qu.:0.8013 3rd Qu.:0.3134 3rd Qu.:0.10858 3rd Qu.:0.07884
## Max. :0.9429 Max. :0.4053 Max. :0.28571 Max. :0.26190
##
## p_326 p_327 cluster
## Min. :0.0000000 Min. :0.00000 Min. :2
## 1st Qu.:0.0000000 1st Qu.:0.05405 1st Qu.:2
## Median :0.0006964 Median :0.07612 Median :2
## Mean :0.0046191 Mean :0.07768 Mean :2
## 3rd Qu.:0.0060423 3rd Qu.:0.09221 3rd Qu.:2
## Max. :0.1250000 Max. :0.37500 Max. :2
##
El 76% de los habitantes de los barrios de este clusters consideran que tienen suficiente información sobre plnaificación familiar aunque solo el 28% de ellos planifican. Muy pocos se han sentido molestias de salud que no han requerido hospitalización
Grupo 3
summary(df_member_salud[df_member_salud$cluster == 3,])
## comuna barrio p_307
## PALMITAS :3 BARRO BLANCO :1 Min. :0.7368
## SAN CRISTOBAL :3 BATALLÓN GIRARDOT:1 1st Qu.:0.8922
## SAN ANTONIO DE PRADO:2 BOQUERÓN :1 Median :0.9366
## BUENOS AIRES :1 DESCONOCIDO :1 Mean :0.9197
## CASTILLA :1 LA ALDEA :1 3rd Qu.:1.0000
## SANTA ELENA :1 LA ASOMADERA Nº 3:1 Max. :1.0000
## (Other) :1 (Other) :6
## p_308 p_324 p_325 p_326
## Min. :0.4667 Min. :0.00000 Min. :0.00000 Min. :0.000000
## 1st Qu.:0.5604 1st Qu.:0.03676 1st Qu.:0.01838 1st Qu.:0.000000
## Median :0.5992 Median :0.08967 Median :0.08967 Median :0.000000
## Mean :0.6490 Mean :0.12065 Mean :0.10397 Mean :0.001225
## 3rd Qu.:0.6920 3rd Qu.:0.20066 3rd Qu.:0.15514 3rd Qu.:0.000000
## Max. :1.0000 Max. :0.28571 Max. :0.28571 Max. :0.014706
##
## p_327 cluster
## Min. :0.00000 Min. :3
## 1st Qu.:0.04044 1st Qu.:3
## Median :0.13767 Median :3
## Mean :0.11936 Mean :3
## 3rd Qu.:0.20000 3rd Qu.:3
## Max. :0.22930 Max. :3
##
El 91% de la población que respondió esta encuesta dice tener suficiente información sobre los métodos de planificación familiar y el 64% de ellos planifican, utilizan los servicios de promoción y prevención dado por la alcaldia en muy baja medida
Grupo 4
summary(df_member_salud[df_member_salud$cluster == 4,])
## comuna barrio p_307
## MANRIQUE :14 LAS PALMAS : 2 Min. :0.6161
## VILLA HERMOSA:14 SAN PABLO : 2 1st Qu.:0.7734
## POPULAR :12 AGUAS FRÍAS : 1 Median :0.7980
## ROBLEDO :12 ALDEA PABLO VI : 1 Mean :0.7995
## ARANJUEZ :11 ALEJANDRO ECHAVARRÍA: 1 3rd Qu.:0.8309
## EL POBLADO :11 ALTAMIRA : 1 Max. :0.9200
## (Other) :85 (Other) :151
## p_308 p_324 p_325 p_326
## Min. :0.3200 Min. :0.00000 Min. :0.00000 Min. :0.000000
## 1st Qu.:0.3656 1st Qu.:0.06516 1st Qu.:0.04621 1st Qu.:0.000000
## Median :0.3854 Median :0.08306 Median :0.06039 Median :0.003824
## Mean :0.3936 Mean :0.08236 Mean :0.06079 Mean :0.005367
## 3rd Qu.:0.4206 3rd Qu.:0.09858 3rd Qu.:0.07483 3rd Qu.:0.007219
## Max. :0.5204 Max. :0.26950 Max. :0.17431 Max. :0.042105
##
## p_327 cluster
## Min. :0.00000 Min. :4
## 1st Qu.:0.04913 1st Qu.:4
## Median :0.07340 Median :4
## Mean :0.07636 Mean :4
## 3rd Qu.:0.09237 3rd Qu.:4
## Max. :0.35000 Max. :4
##
Análisis general de los grupos de acuerdo a las preguntas de la Encuesta de Calidad de Vida de Medellín
ECV_SALUD_KMEANS <- kmeans_model_k4$centers
ECV_SALUD_KMEANS <- data.frame(ECV_SALUD_KMEANS)
ECV_SALUD_KMEANS %>% tibble::rownames_to_column("cluster") -> ECV_SALUD_KMEANS
ECV_SALUD_KMEANS$cluster <- as.factor(ECV_SALUD_KMEANS$cluster)
summary_cluster_means <- ggparcoord(data = ECV_SALUD_KMEANS, columns = c(2:7), groupColumn = "cluster", scale = "globalminmax", showPoints = TRUE, alphaLines = 0.5) + labs(x = "Indicador / Preguntas", y = "Medias", title = "Análisis General de los cluster de acuerdo a las preguntas de la dimensión") + theme(plot.title = element_text(size=12), axis.text=element_text(size=8))
ggplotly(summary_cluster_means)
Características que distinguen un grupo de barrios de otro
Grupo 1: se caracterizan por no participar activamente de la encuesta para los indicadores seleccionados en la dimensión salud, sin embargo en mayor porcentaje utilizan los servicios de prevención y promoción
Grupo 3: se caracterizan por conocer y usar los métodos de planificación familiar, este conjunto de barrios cuando se enferman o tienen algún accidente consultan a la red de servicios en salud
Grupo 2-4: Si bien el grupo 2 y 4 son muy similares se diferencian en que este grupo es más conocedor de los metodos de planificación familiar y planifican en mayor número de personas allí que en el grupo 4
Una caracteristica en común de los grupos de barrios es cuando han consultado en los servicios médicos han tenido un mal servicio
df_member_salud %>% group_by(cluster) %>% summarise(p_307=min(p_307), p_308 = min(p_308), p_324= min(p_324), p_325=min(p_325),p_326=min(p_326),p_327=min(p_327)) -> ECV_SALUD_KMEANS_MIN
ECV_SALUD_MIN <- data.frame((t(ECV_SALUD_KMEANS_MIN)))
ECV_SALUD_MIN <- setNames(ECV_SALUD_MIN,c("cluster_1","cluster_2","cluster_3","cluster_4"))
ECV_SALUD_MIN <- ECV_SALUD_MIN[3:8,]
ECV_SALUD_MIN %>% tibble::rownames_to_column("pregunta") -> ECV_SALUD_MIN
df_member_salud %>% group_by(cluster) %>% summarise(p_307=max(p_307), p_308 = max(p_308), p_324= max(p_324), p_325=min(p_325), p_326=max(p_326), p_327=max(p_327)) -> ECV_SALUD_KMEANS_MAX
ECV_SALUD_MAX <- data.frame((t(ECV_SALUD_KMEANS_MAX)))
ECV_SALUD_MAX <- setNames(ECV_SALUD_MAX,c("cluster_1","cluster_2","cluster_3","cluster_4"))
ECV_SALUD_MAX <- ECV_SALUD_MAX[3:8,]
ECV_SALUD_MAX %>% tibble::rownames_to_column("pregunta") -> ECV_SALUD_MAX
df_c_1 <- data.frame(ECV_SALUD_MIN$pregunta,round(ECV_SALUD_MIN$cluster_1 * 100,digits = 2))
df_c_1 <- Jmisc::addCol(df_c_1,value="1")
df_c_1 <- Jmisc::addCol(df_c_1,value="min")
df_c_1 <- setNames(df_c_1,c("pregunta","valor","cluster","funcion"))
df_c_2 <- data.frame(ECV_SALUD_MIN$pregunta,round(ECV_SALUD_MIN$cluster_2 * 100, digits = 2))
df_c_2 <- Jmisc::addCol(df_c_2,value="2")
df_c_2 <- Jmisc::addCol(df_c_2,value="min")
df_c_2 <- setNames(df_c_2,c("pregunta","valor","cluster","funcion"))
df_c_3 <- data.frame(ECV_SALUD_MIN$pregunta,round(ECV_SALUD_MIN$cluster_3 * 100,digits = 2))
df_c_3 <- Jmisc::addCol(df_c_3,value="3")
df_c_3 <- Jmisc::addCol(df_c_3,value="min")
df_c_3 <- setNames(df_c_3,c("pregunta","valor","cluster","funcion"))
df_c_4 <- data.frame(ECV_SALUD_MIN$pregunta,round(ECV_SALUD_MIN$cluster_4 * 100, digits = 2))
df_c_4 <-Jmisc::addCol(df_c_4,value="4")
df_c_4 <- Jmisc::addCol(df_c_4,value="min")
df_c_4 <- setNames(df_c_4,c("pregunta","valor","cluster","funcion"))
df_c_t <- NULL
df_c_t <- rbind(df_c_t,df_c_1)
df_c_t <- rbind(df_c_t,df_c_2)
df_c_t <- rbind(df_c_t,df_c_3)
df_c_t <- rbind(df_c_t,df_c_4)
df_c_1 <- data.frame(ECV_SALUD_MAX$pregunta,round(ECV_SALUD_MAX$cluster_1 * 100,digits = 2))
df_c_1 <- Jmisc::addCol(df_c_1,value="1")
df_c_1 <- Jmisc::addCol(df_c_1,value="max")
df_c_1 <- setNames(df_c_1,c("pregunta","valor","cluster","funcion"))
df_c_2 <- data.frame(ECV_SALUD_MAX$pregunta,round(ECV_SALUD_MAX$cluster_2 * 100, digits = 2))
df_c_2 <- Jmisc::addCol(df_c_2,value="2")
df_c_2 <- Jmisc::addCol(df_c_2,value="max")
df_c_2 <- setNames(df_c_2,c("pregunta","valor","cluster","funcion"))
df_c_3 <- data.frame(ECV_SALUD_MAX$pregunta,round(ECV_SALUD_MAX$cluster_3 * 100,digits = 2))
df_c_3 <- Jmisc::addCol(df_c_3,value="3")
df_c_3 <- Jmisc::addCol(df_c_3,value="max")
df_c_3 <- setNames(df_c_3,c("pregunta","valor","cluster","funcion"))
df_c_4 <- data.frame(ECV_SALUD_MAX$pregunta,round(ECV_SALUD_MAX$cluster_4 * 100, digits = 2))
df_c_4 <-Jmisc::addCol(df_c_4,value="4")
df_c_4 <- Jmisc::addCol(df_c_4,value="max")
df_c_4 <- setNames(df_c_4,c("pregunta","valor","cluster","funcion"))
df_c_t <- rbind(df_c_t,df_c_1)
df_c_t <- rbind(df_c_t,df_c_2)
df_c_t <- rbind(df_c_t,df_c_3)
df_c_t <- rbind(df_c_t,df_c_4)
r_1 <- ggplot(df_c_t %>% filter(cluster=="1"), aes(x = pregunta, y = valor, col = funcion, group = funcion)) +
geom_polygon(fill = NA) + coord_polar() + labs(title="Cluster 1")
r_2 <- ggplot(df_c_t %>% filter(cluster=="2"), aes(x = pregunta, y = valor, col = funcion, group = funcion)) +
geom_polygon(fill = NA) + coord_polar() + labs(title="Cluster 2")
r_3 <- ggplot(df_c_t %>% filter(cluster=="3"), aes(x = pregunta, y = valor, col = funcion, group = funcion)) +
geom_polygon(fill = NA) + coord_polar() + labs(title="Cluster 3")
r_4 <- ggplot(df_c_t %>% filter(cluster=="4"), aes(x = pregunta, y = valor, col = funcion, group = funcion)) +
geom_polygon(fill = NA) + coord_polar() + labs(title="Cluster 4")
grid.arrange(r_1,r_2,r_3,r_4,ncol = 2)
Conozcamos algunos barrios que pertenecen a cada uno de estos grupos
#df_member_salud[order(df_member_salud$cluster),]
head(df_member_salud[df_member_salud$cluster == 1,]$barrio)
## [1] GUAYAQUIL EL CARMELO
## 299 Levels: AGUAS FRÍAS ALDEA PABLO VI ALEJANDRÍA ... YARUMALITO
head(df_member_salud[df_member_salud$cluster == 2,]$barrio)
## [1] ALTAVISTA CENTRAL ÁREA DE EXPANSIÓN ALTAVISTA
## [3] ÁREA DE EXPANSIÓN BELÉN RINCÓN EL CORAZÓN EL MORRO
## [5] LA ESPERANZA SAN JOSÉ DEL MANZANILLO
## 299 Levels: AGUAS FRÍAS ALDEA PABLO VI ALEJANDRÍA ... YARUMALITO
head(df_member_salud[df_member_salud$cluster == 3,]$barrio)
## [1] LA ASOMADERA Nº 3 DESCONOCIDO LA ALDEA POTRERA MISERENGA
## [5] VOLCANA GUAYABAL LA FLORIDA
## 299 Levels: AGUAS FRÍAS ALDEA PABLO VI ALEJANDRÍA ... YARUMALITO
##3. Análisis espacial Se cargan las subdivisiones territoriales de Medellín, tomadas de la página web de opendata[2]
barrios_med <- readOGR("./dataSet/Barrio_Vereda/Barrio_Vereda.shp",layer="Barrio_Vereda")
## OGR data source with driver: ESRI Shapefile
## Source: "/Users/yosel/Desktop/Especializacion/AprendizajeEstadistico/Agrupamiento/Taller 01/TAE_T1/dataSet/Barrio_Vereda/Barrio_Vereda.shp", layer: "Barrio_Vereda"
## with 332 features
## It has 6 fields
## Integer64 fields read as strings: OBJECTID SUBTIPO_BA
#Conversión de codificaciones
nombres_barrios <- iconv(barrios_med@data$NOMBRE,"UTF-8","ISO_8859-1")
df_member_salud$barrio <- tolower(df_member_salud$barrio)
Función que busca capitalizar los nombres de los barrios
Caps <- function(x) {
s <- strsplit(x, " ")[[1]]
paste(toupper(substring(s, 1,1)), substring(s, 2), sep="", collapse=" ")
}
df_member_salud$barrio <- sapply(df_member_salud$barrio, Caps)
Debido a inconsistenias entre los nombres de los barrios de la data de poligonos y los nombres de los barrios de la Encuesta de Calidad de Vida, se procede a realizar reemplazos manuales
df_member_salud$barrio[df_member_salud$barrio == "Barrios De Jesús"] <- "Barrios de Jesús"
df_member_salud$barrio[df_member_salud$barrio == "Piedras Blancas"] <- "Piedras Blancas - Matasano"
df_member_salud$barrio[df_member_salud$barrio == "Area Expansion San Antonio De Prado"] <- "Ã\u0081rea de Expansión San Antonio de Prado"
df_member_salud$barrio[df_member_salud$barrio == "Prado"] <- "San Antonio de Prado"
df_member_salud$barrio[df_member_salud$barrio == "Altavista Central"] <- "Altavista Sector Central"
df_member_salud$barrio[df_member_salud$barrio == "San José Del Manzanillo"] <- "San José del Manzanillo"
df_member_salud$barrio[df_member_salud$barrio == "El Yolombo"] <- "Yolombo"
df_member_salud$barrio[df_member_salud$barrio == "Urquita"] <- "Urquitá"
df_member_salud$barrio[df_member_salud$barrio == "Corregimiento Palmitas"] <- "Palmitas Sector Central"
df_member_salud$barrio[df_member_salud$barrio == "San Jose De La Montaña"] <- "San José de La Montaña"
df_member_salud$barrio[df_member_salud$barrio == "Cabecera San Cristóbal"] <- "Cabecera Urbana Corregimiento San Cristóbal"
df_member_salud$barrio[df_member_salud$barrio == "Area Expansion Pajarito"] <- "Ãrea de Expansión Pajarito"
df_member_salud$barrio[df_member_salud$barrio == "Area De Expancion San Cristobal"] <- "Ãrea de Expansión San Cristóbal"
df_member_salud$barrio[df_member_salud$barrio == "Santa Maria De Los ángeles"] <- "Santa MarÃ�a de Los Ãngeles"
df_member_salud$barrio[df_member_salud$barrio == "Juan Pablo Ii"] <- "Parque Juan Pablo II"
df_member_salud$barrio[df_member_salud$barrio == "Bombona No.1"] <- "Bomboná No.1"
df_member_salud$barrio[df_member_salud$barrio == "Bombona No.2"] <- "Bomboná No.2"
df_member_salud$barrio[df_member_salud$barrio == "La Asomadera No.1"] <- "Asomadera No.1"
df_member_salud$barrio[df_member_salud$barrio == "La Asomadera No.2"] <- "Asomadera No.2"
df_member_salud$barrio[df_member_salud$barrio == "Los Cerros El Verjel"] <- "Los Cerros El Vergel"
df_member_salud$barrio[df_member_salud$barrio == "Villa Tina"] <- "Villatina"
df_member_salud$barrio[df_member_salud$barrio == "Santa Ines"] <- "Santa Inés"
df_member_salud$barrio[df_member_salud$barrio == "Campo Valdes No.2"] <- "Campo Valdés No.2"
df_member_salud$barrio[df_member_salud$barrio == "Progreso"] <- "El Progreso"
df_member_salud$barrio[df_member_salud$barrio == "Progreso no.2"] <- "Progreso No.2"
df_member_salud$barrio[df_member_salud$barrio == "Doce De Octubre No.1"] <- "Doce de Octubre No.1"
df_member_salud$barrio[df_member_salud$barrio == "Doce De Octubre No.2"] <- "Doce de Octubre No.2"
df_member_salud$barrio[df_member_salud$barrio == "Santo Domingo Sabio No.1"] <- "Santo Domingo Savio No.1"
df_member_salud$barrio[df_member_salud$barrio == "Santo Domingo Sabio No.2"] <- "Santo Domingo Savio No.2"
df_member_salud$barrio[df_member_salud$barrio == "Moscu No.1"] <- "Moscú No.1"
df_member_salud$barrio[df_member_salud$barrio == "Moscu No.2"] <- "Moscú No.2"
df_member_salud$barrio[df_member_salud$barrio == "San Josela Cima No.1"] <- "San José La Cima No.1"
df_member_salud$barrio[df_member_salud$barrio == "San Jose La Cima No.2"] <- "San José La Cima No.2"
df_member_salud$barrio[df_member_salud$barrio == "Villa Del Socorro"] <- "Villa del Socorro"
df_member_salud$barrio[df_member_salud$barrio == "El Playon De Los Comuneros"] <- "Playón de Los Comuneros"
df_member_salud$barrio[df_member_salud$barrio == "Santa Fe"] <- "Santa Fé"
df_member_salud$barrio[df_member_salud$barrio == "Santa Rosa De Lima"] <- "Santa Rosa de Lima"
df_member_salud$barrio[df_member_salud$barrio == "Alejandro EchavarrÃa"] <- "Alejandro EchavarrÃ�a"
df_member_salud$barrio[df_member_salud$barrio == "Mira Flores"] <- "Miraflores"
df_member_salud$barrio[df_member_salud$barrio == "Ocho De Marzo"] <- "Ocho de Marzo"
df_member_salud$barrio[df_member_salud$barrio == "Villa Lilliam"] <- "Villa Liliam"
df_member_salud$barrio[df_member_salud$barrio == "Altos Del Poblado"] <- "Altos del Poblado"
df_member_salud$barrio[df_member_salud$barrio == "Villa Lilliam"] <- "Villa Liliam"
df_member_salud$barrio[df_member_salud$barrio == "La Loma De Los Bernal"] <- "La Loma de Los Bernal"
df_member_salud$barrio[df_member_salud$barrio == "área De Expansión Belén Rincón"] <- "Ãrea de Expansión Belén Rincón"
df_member_salud$barrio[df_member_salud$barrio == "Carlos E Restrepo"] <- "Carlos E. Restrepo"
df_member_salud$barrio[df_member_salud$barrio == "área De Expansión Belén Rincón"] <- "Ãrea de Expansión Belén Rincón"
Selección de los campos necesarios, barrio y cluster
df_member_salud %>% select(barrio, cluster) -> df_member_salud
Se unen los dataframe de barrios_med en donde se encuentra los poligonos de los barrios de Medellín con su respectivo cluster
barrios_cluster <- merge(barrios_med, df_member_salud[!duplicated(df_member_salud$barrio), ], by.x="NOMBRE", by.y="barrio", all.x = TRUE)
Se procede a dibujar el mapa de Medellín señalando cada uno de los barrios a que cluster pertenece
map <-leaflet(barrios_cluster)
factpal <- colorFactor(topo.colors(4), barrios_cluster$cluster)
map <- addPolygons(map, popup = nombres_barrios, color = ~factpal(cluster),
dashArray = "2",
fillOpacity = 0.7,
highlight = highlightOptions(
weight = 5,
color = "#666",
dashArray = "",
fillOpacity = 0.7,
bringToFront = TRUE),
#label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto"))
map <- addTiles(map)
map